package keyword

import "fmt"

/*
	指针实例化和非指针实例化的区别
	1.指针实例化,修改结构体里面对应的内存地址，修改指针对应值，结构体里面值也会发生改变。共享一个内存
	2.非指针实例化，则是拷贝一份原来结构体，实例化后不会对原来指针产生任何的影响。
*/

type Person struct {
	Name string
	Age  int
}

// 值参数类型
/*
	在这个例子中，modifyPersonValue函数接收一个Person类型的参数，这是一个值传递。
	因此，函数内部对p.Age和p.Name的修改不会反映到DifferenceValueAndPoint函数中的Name和Age变量上。
*/
func modifyPersonValue(p Person) {
	fmt.Println("[before]modifyPersonValue.p.Age:", p.Age)
	fmt.Println("[before]modifyPersonValue.p.Name:", p.Name)
	p.Age = 23
	p.Name = "张三"
	fmt.Println("[After]modifyPersonValue.p.Age:", p.Age)
	fmt.Println("[After]modifyPersonValue.p.Name:", p.Name)
}

// 指针参数类型
/*
	在这个例子中，modifyPersonPoint函数接收一个指向*Person类型的指针参数。
	因此，函数内部对p.Name和p.Age的修改会直接修改modifyPersonPoint函数中的Name和age变量。
*/
func modifyPersonPoint(p *Person) {
	fmt.Println("[before]modifyPersonPoint.p.Age:", p.Age)
	fmt.Println("[before]modifyPersonPoint.p.Name:", p.Name)
	p.Age = 18
	p.Name = "鬼火少年团"
	fmt.Println("[After]modifyPersonPoint.p.Age:", p.Age)
	fmt.Println("[After]modifyPersonPoint.p.Name:", p.Name)
}

func DifferenceValueAndPoint() {
	// 值实例: 创建了一个临时副本
	Person1 := Person{
		Name: "李四",
		Age:  22,
	}
	// 修改的是拷贝Person的结构体
	// 创建的是临时的副本传递给modifyPersonValue这个函数,修改临时副本里面值。不会影响Person实例化里面的值
	modifyPersonValue(Person1)
	fmt.Println("值参数类型:", Person1)
	// 指针实例
	Person2 := &Person{
		Name: "奥德彪",
		Age:  17,
	}
	// 修改的是原始结构体
	modifyPersonPoint(Person2)
	fmt.Println("指针类型修改后的值:", Person2)
}
